iT邦幫忙

2022 iThome 鐵人賽

DAY 24
0
Modern Web

前端技術研究系列 第 24

Redux Toolkit query 名詞解釋

  • 分享至 

  • xImage
  •  

RTK query 部分在專案上並未實用過,其實官網提供的基礎範例也並未使用,大概介紹一下他的概念就行。

功能面

1.RTKQ 會自動處理 dedupe(重複數據刪除) 的情況(在同一頁面中有多個元件需要大相同的 API 取得相同的資源時,只會發出一次 request)。
2.透過 RTK Query 可以不需使用 thunks 或任何 reducers 來管理 data fetching 的資料

補充:
thunk:
thunk為一個能在其中呼叫另一個子程序(subroutine)的子程序。若以function的作為例子,thunk就是一個function的內部會去呼叫另一個function,也就是再包裝的概念。
將這個概念用在Redux-Thunk上,便是包裝一個action creator為一個thunk。原生概念的action creator是回傳一個action(object);而若是「thunk化」的action creator,則回傳一個function。

RTK Query包含以下APIs:

  • createApi():
    RTK Query的核心功能,可以建立 API service,集中管理 API 定義檔,在 createApi中提供了 reducer、middleware、custom hooks 等可以使用。
    ??如下方程式範例,每一個 baseURL 都只應該有一個 API slice,例如,如果會需要取得/api/posts 和 /api/users 的資料,則它們應該是在同一個 API slice 中,有相同的 baseURL /api/,和不同的 endpoint。

  • fetchBaseQuery():
    用於簡化 fetch requests。常用於api取得authorization 。
    在 createApi以baseQuery代入使用。

// Or from '@reduxjs/toolkit/query/react'
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query'

export const pokemonApi = createApi({
  baseQuery: fetchBaseQuery({ baseUrl: 'https://pokeapi.co/api/v2/' }), // Set the baseUrl for every endpoint below
  endpoints: (builder) => ({
    getPokemonByName: builder.query({
      query: (name: string) => `pokemon/${name}`, // Will make a request like https://pokeapi.co/api/v2/pokemon/bulbasaur
    }),
    updatePokemon: builder.mutation({
      query: ({ name, patch }) => ({
        url: `pokemon/${name}`,
        method: 'PATCH', // When performing a mutation, you typically use a method of PATCH/PUT/POST/DELETE for REST endpoints
        body: patch, // fetchBaseQuery automatically adds `content-type: application/json` to the Headers and calls `JSON.stringify(patch)`
      }),
    }),
  }),
})
  • <ApiProvider />:
    若無Redux store同Provider的功能。
    ??小提醒:它與現有的 Redux store一起使用會導致它們相互衝突。

    • 範例 ApiProvider

      import * as React from 'react';
      import { ApiProvider } from '@reduxjs/toolkit/query/react';
      import { Pokemon } from './features/Pokemon';
      
      function App() {
        return (
          <ApiProvider api={api}>
            <Pokemon />
          </ApiProvider>
        );
      }
      
    • 範例 Provider

      import React from 'react'
      import ReactDOM from 'react-dom'
      import { Provider } from 'react-redux'
      
      import { App } from './App'
      import createStore from './createReduxStore'
      
      const store = createStore()
      
      // As of React 18
      const root = ReactDOM.createRoot(document.getElementById('root'))
      root.render(
        <Provider store={store}>
          <App />
        </Provider>
      )
      
  • setupListeners():
    執行 refetchOnMount 、 refetchOnReconnect 的行為。
    透過 refetch 可以確保過期的資料有從伺服器被更新


上一篇
useState 的 object 與 function
下一篇
認識 Higher-Order Component
系列文
前端技術研究30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言